home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Programming / Triton / Source / classes / text.c < prev    next >
C/C++ Source or Header  |  1998-05-23  |  8KB  |  222 lines

  1. /*
  2.  *  OpenTriton -- A free release of the triton.library source code
  3.  *  Copyright (C) 1993-1998  Stefan Zeiger
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  */
  20.  
  21.  
  22. /****** triton.library/class_Text ******
  23. *
  24. *   NAME    
  25. *    class_Text -- A line of text / A value
  26. *
  27. *   SUPERCLASS
  28. *    class_DisplayObject
  29. *
  30. *   SYNOPSIS
  31. *    TROB_Text
  32. *
  33. *   ATTRIBUTES
  34. *    <Default>        : <unused>
  35. *    TRAT_Text        : STRPTR text
  36. *                       [create, set]
  37. *    TRAT_Value       : ULONG number
  38. *                       [create, set]
  39. *    TRAT_MinWidth    : ULONG number_of_average_chars
  40. *                       [create]
  41. *    TRAT_Flags       : ULONG flags
  42. *                       - TRTX_NOUNDERSCORE    : Don't interpret underscores
  43. *                       - TRTX_HIGHLIGHT       : Highlight text
  44. *                       - TRTX_3D              : Highlight with shadows
  45. *                       - TRTX_BOLD            : Bold text
  46. *                       - TRTX_TITLE           : Use this for titles (e.g.
  47. *                                                of separator bars).
  48. *                       - TRTX_RIGHTALIGN (V6) : Align text to the right border
  49. *                       - TRTX_CENTER (V6)     : Center text
  50. *                       - TRTX_CLIPPED (V4)    : Text is resizable in X
  51. *                                                direction. Text which
  52. *                                                exceeds the available
  53. *                                                space will be truncated.
  54. *                       - TRTX_MULTILINE (V6)  : See TR_PrintText() autodoc
  55. *                                                clip for details
  56. *                       [create]
  57. *
  58. *   NOTES
  59. *    TRTX_CLIPPED is mutually exclusive with TRTX_MULTILINE and TRTX_RIGHTALIGN.
  60. *    Non-clipped texts (and especially multi-line texts) should not be changed.
  61. *    Clipping is not possible when TRAT_MinWidth is specified.
  62. *
  63. *   SEE ALSO
  64. *    TR_PrintText()
  65. *
  66. ******/
  67.  
  68.  
  69. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. //////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
  71. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72.  
  73. #define TR_THIS_IS_TRITON
  74.  
  75. #include <libraries/triton.h>
  76. #include <clib/triton_protos.h>
  77. #include "/internal.h"
  78. #include "text.def"
  79.  
  80. #include <stdio.h>
  81. #include <ctype.h>
  82.  
  83.  
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////////////////////////////////////////////// Object data //
  86. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87.  
  88. #define OBJECT (&(object->DO.O))
  89. #define DISPLAYOBJECT (&(object->DO))
  90. #define TEXT object
  91.  
  92.  
  93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. ///////////////////////////////////////////////////////////////////////////////////// A private definition //
  95. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96.  
  97. #define TRTX_ISTEXT 0x00020000L
  98.  
  99.  
  100. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. ////////////////////////////////////////////////////////////////////////////////////////////////// Methods //
  102. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103.  
  104. TR_METHOD(Text,NEW,NewData)
  105. {
  106.   if(!TRDP_DisplayObject_NEW(object,messageid,data,metaclass->trc_SuperClass)) return NULL;
  107.  
  108.   if(!DISPLAYOBJECT->MinWidth)
  109.     {
  110.       if(DISPLAYOBJECT->Flags&TRTX_CLIPPED)
  111.     {
  112.       DISPLAYOBJECT->MinWidth=2*data->project->trp_PropFont->tf_XSize;
  113.       DISPLAYOBJECT->XResize=TRUE;
  114.     }
  115.       else
  116.     DISPLAYOBJECT->MinWidth=TR_TextWidth(data->project,(STRPTR)(DISPLAYOBJECT->PrivData),
  117.                          DISPLAYOBJECT->Flags);
  118.     }
  119.  
  120.   DISPLAYOBJECT->MinHeight=TR_TextHeight(data->project,(STRPTR)(DISPLAYOBJECT->PrivData),
  121.                      DISPLAYOBJECT->Flags);
  122.  
  123.   return (ULONG)object;
  124. }
  125.  
  126.  
  127. TR_SIMPLEMETHOD(Text,INSTALL_REFRESH)
  128. {
  129.   struct TR_Project *project;
  130.   UBYTE remdchar;
  131.   ULONG rempos, left;
  132.  
  133.   TR_SUPERMETHOD;
  134.   project=OBJECT->Project;
  135.   left=DISPLAYOBJECT->Left;
  136.  
  137.   TR_InternalAreaFill(OBJECT->Project,NULL,left,DISPLAYOBJECT->Top,
  138.               left+DISPLAYOBJECT->Width-1,
  139.               DISPLAYOBJECT->Top+DISPLAYOBJECT->Height-1,DISPLAYOBJECT->BackfillType);
  140.  
  141.   if(DISPLAYOBJECT->Flags&TRTX_CLIPPED)
  142.     {
  143.       /* Cut string to fit */
  144.       rempos=TR_FirstOccurance(0,(STRPTR)(DISPLAYOBJECT->PrivData));
  145.       remdchar=0;
  146.       while((TR_TextWidth(project,(STRPTR)(DISPLAYOBJECT->PrivData),DISPLAYOBJECT->Flags)
  147.          > DISPLAYOBJECT->Width) && rempos>0 )
  148.     {
  149.       ((STRPTR)(DISPLAYOBJECT->PrivData))[rempos]=remdchar;
  150.       rempos--;
  151.       remdchar=((STRPTR)(DISPLAYOBJECT->PrivData))[rempos];
  152.       ((STRPTR)(DISPLAYOBJECT->PrivData))[rempos]=0;
  153.     }
  154.     }
  155.   TR_PrintText(project, project->trp_Window->RPort, (STRPTR)(DISPLAYOBJECT->PrivData),
  156.            left, DISPLAYOBJECT->Top, DISPLAYOBJECT->Width, DISPLAYOBJECT->Flags);
  157.   /* Restore original string */
  158.   if(DISPLAYOBJECT->Flags&TRTX_CLIPPED) ((STRPTR)(DISPLAYOBJECT->PrivData))[rempos]=remdchar;
  159.   return 1L;
  160. }
  161.  
  162.  
  163. TR_METHOD(Text,SETATTRIBUTE,SetAttributeData)
  164. {
  165.   STRPTR oldstring,newstring,setstring;
  166.   UBYTE lineoftext[20];
  167.   ULONG oldlength,newlength;
  168.   LONG uspos;
  169.  
  170.   switch(data->attribute)
  171.     {
  172.     case TRAT_Value:
  173.       if(DISPLAYOBJECT->Flags&TRTX_ISTEXT) return 0;
  174.       TR_SPrintF(lineoftext,"%ld",data->value);
  175.       setstring=lineoftext;
  176.       /* Continue with the TRAT_Text statements below... */
  177.  
  178.     case TRAT_Text:
  179.       if(data->attribute==TRAT_Text)
  180.     {
  181.       /* Once a text, always a text... (sad but true) */
  182.       DISPLAYOBJECT->Flags|=TRTX_ISTEXT;
  183.       setstring=(STRPTR)(data->value);
  184.     }
  185.  
  186.       newlength=TR_FirstOccurance(0,setstring)+1;
  187.       oldstring=(STRPTR)(DISPLAYOBJECT->PrivData);
  188.       oldlength=TEXT->TextLength;
  189.  
  190.       if(!(newstring=(STRPTR)TR_AllocPooled(OBJECT->Project->trp_MemPool,newlength))) return 0;
  191.  
  192.       DISPLAYOBJECT->PrivData=(ULONG)newstring;
  193.       TEXT->TextLength=newlength;
  194.       CopyMem((APTR)setstring,(APTR)newstring,newlength);
  195.       if(oldstring) TR_FreePooled(OBJECT->Project->trp_MemPool,(APTR)oldstring,oldlength);
  196.       if((uspos=
  197.       TR_FirstOccurance(OBJECT->Project->trp_Underscore,(STRPTR)(DISPLAYOBJECT->PrivData))+1))
  198.     DISPLAYOBJECT->Shortcut=tolower(((STRPTR)(DISPLAYOBJECT->PrivData))[uspos]);
  199.       if(DISPLAYOBJECT->Installed) TR_DIRECTMETHODCALL(Text,INSTALL_REFRESH);
  200.       return 1;
  201.  
  202.     case TRAT_MinWidth:
  203.       DISPLAYOBJECT->MinWidth=data->value * OBJECT->Project->trp_PropFont->tf_XSize;
  204.       return 1;
  205.  
  206.     case TRAT_Flags:
  207.       DISPLAYOBJECT->Flags|=data->value;
  208.       return 1;
  209.  
  210.     default:
  211.       return TRDP_DisplayObject_SETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
  212.     }
  213. }
  214.  
  215.  
  216. TR_SIMPLEMETHOD(Text,DISPOSE)
  217. {
  218.   if(DISPLAYOBJECT->PrivData)
  219.     TR_FreePooled(OBJECT->Project->trp_MemPool,(APTR)(DISPLAYOBJECT->PrivData),TEXT->TextLength);
  220.   return 1L;
  221. }
  222.